/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

/*
 * @Author: Wang Shuo wangshuo@sgsimulation.com
 * @Date: 2024-07-09 09:47:49
 * @LastEditors: wxc superjava@qq.com
 * @LastEditTime: 2024-09-29 13:09:14
 * @FilePath: /SGFEM/DBManager/DBManager/Service/Input/Material/MaterialSummaryService.h"
 */
#pragma once
#include <iostream>
#include <map>
#include <memory>

#include "DBManager/Common/ServiceMacro.h"
#include "DBManager/DBServiceFactory.h"
#include "DBManager/IRepository/Input/Material/IMaterialSummaryRepository.h"
#include "DBManager/IService/Input/Material/IMaterialSummaryService.h"
#include "DBManager/Service/Input/InputServiceBase.h"

SG_DBMANAGER_NAMESPACE_OPEN

class DBManager_DECLSPEC MaterialSummaryService : public IMaterialSummaryService, public InputServiceBase<IMaterialSummaryRepository>
{
  public:
    explicit MaterialSummaryService (DBServiceFactory* const dbServiceFactory, IMaterialSummaryRepository& repos);

    ~MaterialSummaryService () override = default;

    /// @{
    /** @brief 查询材料类型
     *  @param id 材料id号
     *  @return 返回材料类型， 当返回 \ref MaterialTypes::MATTYPE_Unknow, 表示没有找到对应材料定义
     */
    std::vector<SG::DataStructure::FEM::MaterialTypes> GetMaterialType (SG::DataStructure::Common::Id id) const override;

    SG::DataStructure::Common::Status CopyData (DBServiceFactory* const dest, std::vector<SG::DataStructure::Common::Id> id) const override;

  public:
    // summary创建时 用来将各表的需要注册的函数注册进去
    using SummaryCreateService = std::function<void (DBServiceFactory* const)>;

    static bool RegisterService (SummaryCreateService&& service);

    static void CreateSummary (DBServiceFactory* const dbServiceFactory);
};

SG_DBMANAGER_NAMESPACE_CLOSE
